--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / public / rnode-flasher / index.html
Displaying Raw • Download
meshchatx/src/frontend/public/rnode-flasher/index.html 9c739fa940d1bcaefcd5de9a3b461762a7200103 (9c739fa9) Text, 126.01 KB
Tff7b72<!doctype html>
Tb4b4b4<Tff7b72html Te6edf3langTff7b72=Ta5d6ff"en"Tb4b4b4>
Tb4b4b4<Tff7b72headTb4b4b4>
Tb4b4b4<Tff7b72meta Te6edf3charsetTff7b72=Ta5d6ff"UTF-8" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72meta Te6edf3http-equivTff7b72=Ta5d6ff"X-UA-Compatible" Te6edf3contentTff7b72=Ta5d6ff"IE=edge" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72meta Te6edf3nameTff7b72=Ta5d6ff"viewport" Te6edf3contentTff7b72=Ta5d6ff"width=device-width, initial-scale=1, maximum-scale=1" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72titleTb4b4b4>RNode FlasherTb4b4b4<Tb4b4b4/Tff7b72titleTb4b4b4>
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/rnode.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/nrf52_dfu_flasher.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/zip.min.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
T8b949e<!-- tailwind css -->
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"../assets/js/tailwindcss/tailwind-v3.4.3-forms-v0.5.7.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
T8b949e<!-- vue js -->
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/vue@3.4.26/dist/vue.global.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/crypto-js@3.9.1-1/core.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72script Te6edf3srcTff7b72=Ta5d6ff"./js/crypto-js@3.9.1-1/md5.js"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72headTb4b4b4>
Tb4b4b4<Tff7b72body Te6edf3classTff7b72=Ta5d6ff"bg-gray-50 dark:bg-zinc-950 min-h-screen"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3idTff7b72=Ta5d6ff"app" Te6edf3classTff7b72=Ta5d6ff"max-w-7xl mx-auto space-y-4 p-4 sm:p-6"Tb4b4b4>
T8b949e<!-- header -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-3 border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg p-4"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72img Te6edf3srcTff7b72=Ta5d6ff"reticulum_logo_512.png" Te6edf3classTff7b72=Ta5d6ff"w-14 h-14" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-lg text-gray-900 dark:text-zinc-100"Tb4b4b4>RNode FlasherTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-600 dark:text-zinc-400"Tb4b4b4>
Developed by
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://liamcottle.com"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4>Liam CottleTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>1. Select your deviceTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4 space-y-3"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[80px] text-sm font-medium text-gray-700 dark:text-zinc-300"Tb4b4b4>ProductTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"selectedProduct"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3:valueTff7b72=Ta5d6ff"null" Te6edf3disabledTb4b4b4>Select a ProductTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3v-forTff7b72=Ta5d6ff"product of products" Te6edf3:valueTff7b72=Ta5d6ff"product"Tb4b4b4>{{ product.name }}Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[80px] text-sm font-medium text-gray-700 dark:text-zinc-300"Tb4b4b4>ModelTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"selectedModel"
Te6edf3:disabledTff7b72=Ta5d6ff"!selectedProduct"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all disabled:opacity-50 disabled:cursor-not-allowed"
Tb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3:valueTff7b72=Ta5d6ff"null" Te6edf3disabledTb4b4b4>Select a ModelTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3v-ifTff7b72=Ta5d6ff"selectedProduct" Te6edf3v-forTff7b72=Ta5d6ff"model of selectedProduct.models" Te6edf3:valueTff7b72=Ta5d6ff"model"Tb4b4b4>
{{ model.name }}
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- button to enter dfu mode on PLATFORM_NRF52 -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"selectedProduct?.platform === 0x70"
Te6edf3classTff7b72=Ta5d6ff"px-4 pb-4 border-t border-gray-200 dark:border-zinc-800 pt-4"
Tb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"enterDfuMode"
Te6edf3:disabledTff7b72=Ta5d6ff"isEnteringDfuMode"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 px-4 py-2 text-sm font-semibold text-white shadow-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3v-ifTff7b72=Ta5d6ff"isEnteringDfuMode"
Te6edf3classTff7b72=Ta5d6ff"animate-spin h-4 w-4"
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Tb4b4b4>
Tb4b4b4<Tff7b72circle
Te6edf3classTff7b72=Ta5d6ff"opacity-25"
Te6edf3cxTff7b72=Ta5d6ff"12"
Te6edf3cyTff7b72=Ta5d6ff"12"
Te6edf3rTff7b72=Ta5d6ff"10"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3stroke-widthTff7b72=Ta5d6ff"4"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72circleTb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3classTff7b72=Ta5d6ff"opacity-75"
Te6edf3fillTff7b72=Ta5d6ff"currentColor"
Te6edf3dTff7b72=Ta5d6ff"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72pathTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"isEnteringDfuMode"Tb4b4b4>Entering DFU Mode...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-elseTb4b4b4>Enter DFU ModeTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"border-t border-gray-200 dark:border-zinc-800 px-4 py-3 bg-gray-50 dark:bg-zinc-900/50"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-600 dark:text-zinc-400"Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Can't find your device? Open an issue onTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/liamcottle/rnode-flasher"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4>GitHubTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- step 2: Flash firmware (full width) -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>2. Select firmware to flash (.zip)Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4 space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3refTff7b72=Ta5d6ff"file"
Te6edf3typeTff7b72=Ta5d6ff"file"
Te6edf3acceptTff7b72=Ta5d6ff".zip"
Te6edf3classTff7b72=Ta5d6ff"block w-full text-sm text-gray-900 dark:text-zinc-100 border border-gray-200 dark:border-zinc-800 rounded-xl cursor-pointer bg-white dark:bg-zinc-900 focus:outline-none focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 file:mr-4 file:py-2 file:px-4 file:rounded-l-xl file:border-0 file:text-sm file:font-semibold file:bg-blue-600 file:text-white hover:file:bg-blue-700 dark:file:bg-blue-600 dark:hover:file:bg-blue-700"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"flashError"
Te6edf3classTff7b72=Ta5d6ff"rounded-xl bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 p-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-start gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 20 20"
Te6edf3fillTff7b72=Ta5d6ff"currentColor"
Te6edf3classTff7b72=Ta5d6ff"w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5"
Tb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3fill-ruleTff7b72=Ta5d6ff"evenodd"
Te6edf3dTff7b72=Ta5d6ff"M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16ZM8.28 7.22a.75.75 0 0 0-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 1 0 1.06 1.06L10 11.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L11.06 10l1.72-1.72a.75.75 0 0 0-1.06-1.06L10 8.94 8.28 7.22Z"
Te6edf3clip-ruleTff7b72=Ta5d6ff"evenodd"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm font-semibold text-red-800 dark:text-red-300"Tb4b4b4>Flash FailedTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-red-700 dark:text-red-400 mt-1"Tb4b4b4>{{ flashError }}Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"!isFlashing"Tb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"flash"
Te6edf3:disabledTff7b72=Ta5d6ff"!selectedProduct || !selectedModel || !$refs.file?.files[0]"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Te6edf3stroke-widthTff7b72=Ta5d6ff"1.5"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3classTff7b72=Ta5d6ff"w-4 h-4"
Tb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3stroke-linecapTff7b72=Ta5d6ff"round"
Te6edf3stroke-linejoinTff7b72=Ta5d6ff"round"
Te6edf3dTff7b72=Ta5d6ff"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Flash Now
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-medium text-gray-900 dark:text-zinc-100"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"flashingProgress > 0"Tb4b4b4>Flashing: {{flashingProgress}}%Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-elseTb4b4b4>Connecting to device...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-400"Tb4b4b4>{{ flashingStatus }}Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"w-full overflow-hidden rounded-full bg-gray-200 dark:bg-zinc-800 h-2.5"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"h-full rounded-full bg-blue-600 transition-all duration-300"
Te6edf3:styleTff7b72=Ta5d6ff"{ 'width': `${flashingProgress}%`}"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-t border-gray-200 dark:border-zinc-800 px-4 py-3 bg-gray-50 dark:bg-zinc-900/50 space-y-2"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-900 dark:text-zinc-100"Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"font-medium"Tb4b4b4>Download FirmwareTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-ifTff7b72=Ta5d6ff"selectedProduct && selectedModel && recommendedFirmwareFilename"
Tb4b4b4>:
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3:hrefTff7b72=Ta5d6ff"`https://github.com/markqvist/RNode_Firmware/releases/latest/download/${recommendedFirmwareFilename}`"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline font-medium"
Tb4b4b4>{{ recommendedFirmwareFilename }}Tb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72span
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2 text-sm"Tb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/markqvist/RNode_Firmware/releases"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4>Official FirmwareTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-gray-400 dark:text-zinc-600"Tb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/liberatedsystems/RNode_Firmware_CE/releases"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4>CE FirmwareTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-gray-400 dark:text-zinc-600"Tb4b4b4>•Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/attermann/microReticulum_Firmware/releases"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline"
Tb4b4b4>Transport Node FirmwareTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"border-t border-gray-200 dark:border-zinc-800 px-4 py-3 bg-amber-50 dark:bg-amber-900/10"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm font-semibold text-amber-900 dark:text-amber-300 mb-1"Tb4b4b4>Common IssuesTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-sm text-amber-800 dark:text-amber-400 space-y-0.5"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>• Tb4b4b4<Tff7b72strongTb4b4b4>Hardware Failure:Tb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> You need to provision the eeprom in step 3.Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>• Tb4b4b4<Tff7b72strongTb4b4b4>Firmware Corrupt:Tb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> You need to set the firmware hash in step 4.Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- main workflow steps in grid -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 lg:grid-cols-2 gap-4"Tb4b4b4>
T8b949e<!-- left column: steps 1-3 -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
T8b949e<!-- step 3: Provision EEPROM -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>3. Provision EEPROMTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-600 dark:text-zinc-400 mt-0.5"Tb4b4b4>
Sets device info, checksum and blank signature
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-ifTff7b72=Ta5d6ff"!isProvisioning"
@Te6edf3clickTff7b72=Ta5d6ff"provision"
Te6edf3:disabledTff7b72=Ta5d6ff"!selectedProduct || !selectedModel"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
Tb4b4b4>
Provision
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-sm text-gray-700 dark:text-zinc-300"Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3classTff7b72=Ta5d6ff"animate-spin h-5 w-5 text-blue-600 dark:text-blue-400"
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Tb4b4b4>
Tb4b4b4<Tff7b72circle
Te6edf3classTff7b72=Ta5d6ff"opacity-25"
Te6edf3cxTff7b72=Ta5d6ff"12"
Te6edf3cyTff7b72=Ta5d6ff"12"
Te6edf3rTff7b72=Ta5d6ff"10"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3stroke-widthTff7b72=Ta5d6ff"4"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72circleTb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3classTff7b72=Ta5d6ff"opacity-75"
Te6edf3fillTff7b72=Ta5d6ff"currentColor"
Te6edf3dTff7b72=Ta5d6ff"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72pathTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Provisioning: please wait...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- right column: steps 4-5 -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
T8b949e<!-- step 4: Set Firmware Hash -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>4. Set Firmware HashTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-600 dark:text-zinc-400 mt-0.5"Tb4b4b4>Uses hash from boardTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-ifTff7b72=Ta5d6ff"!isSettingFirmwareHash"
@Te6edf3clickTff7b72=Ta5d6ff"setFirmwareHash"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition-colors"
Tb4b4b4>
Set Firmware Hash
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 text-sm text-gray-700 dark:text-zinc-300"Tb4b4b4>
Tb4b4b4<Tff7b72svg
Te6edf3classTff7b72=Ta5d6ff"animate-spin h-5 w-5 text-blue-600 dark:text-blue-400"
Te6edf3xmlnsTff7b72=Ta5d6ff"http://www.w3.org/2000/svg"
Te6edf3fillTff7b72=Ta5d6ff"none"
Te6edf3viewBoxTff7b72=Ta5d6ff"0 0 24 24"
Tb4b4b4>
Tb4b4b4<Tff7b72circle
Te6edf3classTff7b72=Ta5d6ff"opacity-25"
Te6edf3cxTff7b72=Ta5d6ff"12"
Te6edf3cyTff7b72=Ta5d6ff"12"
Te6edf3rTff7b72=Ta5d6ff"10"
Te6edf3strokeTff7b72=Ta5d6ff"currentColor"
Te6edf3stroke-widthTff7b72=Ta5d6ff"4"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72circleTb4b4b4>
Tb4b4b4<Tff7b72path
Te6edf3classTff7b72=Ta5d6ff"opacity-75"
Te6edf3fillTff7b72=Ta5d6ff"currentColor"
Te6edf3dTff7b72=Ta5d6ff"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72pathTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72svgTb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Setting Firmware Hash: please wait...Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- step 5: Done -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>5. DoneTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"px-4 py-4 text-sm text-gray-700 dark:text-zinc-300 space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• If you made it this far, and all previous steps were successful, your RNode should be
ready to use.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• To use RNode with
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/liamcottle/reticulum-meshchat"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline font-medium"
Tb4b4b4>MeshChatTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>, you will need to add an Tb4b4b4<Tff7b72strongTb4b4b4>RNodeInterfaceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> in the
Tb4b4b4<Tff7b72strongTb4b4b4>Interfaces → Add InterfaceTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> page.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• To use RNode with
Tb4b4b4<Tff7b72a
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3hrefTff7b72=Ta5d6ff"https://github.com/markqvist/Sideband/"
Te6edf3classTff7b72=Ta5d6ff"text-blue-600 dark:text-blue-400 hover:underline font-medium"
Tb4b4b4>SidebandTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>, you will need to configure it in Tb4b4b4<Tff7b72strongTb4b4b4>Hardware → RNodeTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> and enable
Tb4b4b4<Tff7b72strongTb4b4b4>Connectivity → Connect via RNodeTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"pt-1 text-amber-700 dark:text-amber-400 font-medium"Tb4b4b4>
• You must restart MeshChat and Sideband for interface setting changes to take effect,
otherwise nothing will happen!
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- optional configuration sections in grid -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 xl:grid-cols-3 gap-4"Tb4b4b4>
T8b949e<!-- Advanced Tools -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>Advanced ToolsTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4 space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"detect"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Detect RNode
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"reboot"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Reboot RNode
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"readDisplay"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Read Display
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"dumpEeprom"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Dump EEPROM
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"wipeEeprom"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-red-100 dark:bg-red-900/30 hover:bg-red-200 dark:hover:bg-red-900/40 px-3 py-2 text-sm font-medium text-red-700 dark:text-red-300 shadow-sm transition-colors"
Tb4b4b4>
Wipe EEPROM
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-400"Tb4b4b4>
EEPROM dumps are shown in dev tools console.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- show rnode display if available -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"rnodeDisplayImage"
Te6edf3classTff7b72=Ta5d6ff"rounded-xl border border-gray-200 dark:border-zinc-800 p-2 bg-gray-50 dark:bg-zinc-900"
Tb4b4b4>
Tb4b4b4<Tff7b72img Te6edf3:srcTff7b72=Ta5d6ff"rnodeDisplayImage" Te6edf3classTff7b72=Ta5d6ff"h-28 mx-auto" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- Configure Bluetooth -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>Configure Bluetooth (optional)Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 px-4 py-3 text-sm text-gray-700 dark:text-zinc-300 space-y-1"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>• Bluetooth is not supported on all devices.Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>• Some devices use Bluetooth Classic, and some use BLE (Bluetooth Low Energy)Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• Put the RNode into Bluetooth Pairing mode, then connect to it from Android Bluetooth
settings.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• Once you have initiated a pair request from Android, a PIN should show on the RNode
display.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• In Sideband you will need to enable Tb4b4b4<Tff7b72strongTb4b4b4>Connect using BluetoothTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> in
Tb4b4b4<Tff7b72strongTb4b4b4>Hardware → RNodeTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• If your device uses BLE you will also need to enable
Tb4b4b4<Tff7b72strongTb4b4b4>Device requires BLETb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4> in Tb4b4b4<Tff7b72strongTb4b4b4>Hardware → RNodeTb4b4b4<Tb4b4b4/Tff7b72strongTb4b4b4>.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"pt-1 text-amber-700 dark:text-amber-400 font-medium"Tb4b4b4>
• Don't forget to restart Sideband for the setting changes to take effect!
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"enableBluetooth"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Enable
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"disableBluetooth"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Disable
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"startBluetoothPairing"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Start Pairing
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- Configure TNC Mode -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden xl:col-span-2"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 bg-white/80 dark:bg-zinc-900/50 backdrop-blur-sm px-4 py-3"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-semibold text-gray-900 dark:text-zinc-100"Tb4b4b4>Configure TNC Mode (optional)Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border-b border-gray-200 dark:border-zinc-800 px-4 py-3 text-sm text-gray-700 dark:text-zinc-300 space-y-1"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>• TNC mode allows an RNode to be used as a KISS compatible TNC over the Serial Port.Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
• This mode makes it usable with amateur radio software that can talk to a KISS TNC over a
serial port.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"pt-1 text-amber-700 dark:text-amber-400 font-medium"Tb4b4b4>
• You must leave TNC mode disabled when using RNode with apps like MeshChat or Sideband.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4 space-y-3"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[125px] text-sm font-medium text-gray-700 dark:text-zinc-300"
Tb4b4b4>Frequency (Hz)Tb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"configFrequency"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[125px] text-sm font-medium text-gray-700 dark:text-zinc-300"
Tb4b4b4>BandwidthTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"configBandwidth"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3v-forTff7b72=Ta5d6ff"bandwidth in RNodeInterfaceDefaults.bandwidths" Te6edf3:valueTff7b72=Ta5d6ff"bandwidth"Tb4b4b4>
{{ bandwidth / 1000 }} KHz
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[125px] text-sm font-medium text-gray-700 dark:text-zinc-300"
Tb4b4b4>Tx Power (dBm)Tb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"configTxPower"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[125px] text-sm font-medium text-gray-700 dark:text-zinc-300"
Tb4b4b4>Spreading FactorTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"configSpreadingFactor"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4>
Tb4b4b4<Tff7b72option
Te6edf3v-forTff7b72=Ta5d6ff"spreadingfactor in RNodeInterfaceDefaults.spreadingfactors"
Te6edf3:valueTff7b72=Ta5d6ff"spreadingfactor"
Tb4b4b4>
{{ spreadingfactor }}
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col sm:flex-row gap-2 items-start sm:items-center"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"min-w-[125px] text-sm font-medium text-gray-700 dark:text-zinc-300"
Tb4b4b4>Coding RateTb4b4b4<Tb4b4b4/Tff7b72label
Tb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"configCodingRate"
Te6edf3classTff7b72=Ta5d6ff"flex-1 sm:flex-none sm:min-w-[280px] bg-white dark:bg-zinc-900 border border-gray-200 dark:border-zinc-800 text-gray-900 dark:text-zinc-100 text-sm rounded-xl focus:ring-2 focus:ring-blue-500/50 focus:border-blue-500 px-4 py-2 shadow-sm transition-all"
Tb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3v-forTff7b72=Ta5d6ff"codingrate in RNodeInterfaceDefaults.codingrates" Te6edf3:valueTff7b72=Ta5d6ff"codingrate"Tb4b4b4>
{{ codingrate }}
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"enableTncMode"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-blue-600 hover:bg-blue-700 dark:bg-blue-600 dark:hover:bg-blue-700 px-4 py-2 text-sm font-semibold text-white shadow-sm transition-colors"
Tb4b4b4>
Enable
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"disableTncMode"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-4 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Disable
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- Configure Display -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"border border-gray-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 rounded-2xl shadow-lg overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-4 space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"text-sm font-medium text-gray-700 dark:text-zinc-300"Tb4b4b4>RotationTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"setDisplayRotation(0)"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center justify-center w-10 h-10 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 text-gray-700 dark:text-zinc-300 shadow-sm transition-colors font-medium"
Tb4b4b4>
0
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"setDisplayRotation(1)"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center justify-center w-10 h-10 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 text-gray-700 dark:text-zinc-300 shadow-sm transition-colors font-medium"
Tb4b4b4>
1
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"setDisplayRotation(2)"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center justify-center w-10 h-10 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 text-gray-700 dark:text-zinc-300 shadow-sm transition-colors font-medium"
Tb4b4b4>
2
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"setDisplayRotation(3)"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center justify-center w-10 h-10 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 text-gray-700 dark:text-zinc-300 shadow-sm transition-colors font-medium"
Tb4b4b4>
3
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72label Te6edf3classTff7b72=Ta5d6ff"text-sm font-medium text-gray-700 dark:text-zinc-300"Tb4b4b4>ReconditioningTb4b4b4<Tb4b4b4/Tff7b72labelTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"startDisplayReconditioning"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Start
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
@Te6edf3clickTff7b72=Ta5d6ff"reboot"
Te6edf3classTff7b72=Ta5d6ff"inline-flex items-center gap-2 rounded-xl bg-gray-100 dark:bg-zinc-800 hover:bg-gray-200 dark:hover:bg-zinc-700 px-3 py-2 text-sm font-medium text-gray-700 dark:text-zinc-300 shadow-sm transition-colors"
Tb4b4b4>
Stop
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"border-t border-gray-200 dark:border-zinc-800 px-4 py-3 bg-gray-50 dark:bg-zinc-900/50"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-600 dark:text-zinc-400"Tb4b4b4>
Setting display rotation requires firmware v1.80+
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
T8b949e<!-- setup web-serial-polyfill -->
Tb4b4b4<Tff7b72script Te6edf3typeTff7b72=Ta5d6ff"module"Tb4b4b4>
Tff7b72import Tb4b4b4{ Te6edf3serial Tb4b4b4} Tff7b72from Ta5d6ff"./js/web-serial-polyfill@1.0.15/dist/serial.js"Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3navigatorTb4b4b4.Te6edf3serial Tff7b72&& Te6edf3navigatorTb4b4b4.Te6edf3usbTb4b4b4) Tb4b4b4{
Te6edf3navigatorTb4b4b4.Te6edf3serial Tff7b72= Te6edf3serialTb4b4b4;
Tb4b4b4}
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
T8b949e<!-- setup esptool-js -->
Tb4b4b4<Tff7b72script Te6edf3typeTff7b72=Ta5d6ff"module"Tb4b4b4>
Tff7b72import Tb4b4b4{ Te6edf3ESPLoaderTb4b4b4, Te6edf3Transport Tb4b4b4} Tff7b72from Ta5d6ff"./js/esptool-js@0.4.5/bundle.js"Tb4b4b4;
Tffa657windowTb4b4b4.Te6edf3ESPLoader Tff7b72= Te6edf3ESPLoaderTb4b4b4;
Tffa657windowTb4b4b4.Te6edf3Transport Tff7b72= Te6edf3TransportTb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tff7b72scriptTb4b4b4>
Te6edf3VueTb4b4b4.Te6edf3createAppTb4b4b4(Tb4b4b4{
Te6edf3dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3rnodeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isFlashingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3flashingProgressTff7b72: T79c0ff0Tb4b4b4,
Te6edf3flashingStatusTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3flashErrorTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isProvisioningTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isSettingFirmwareHashTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isEnteringDfuModeTff7b72: Tff7b72falseTb4b4b4,
Te6edf3rnodeDisplayImageTff7b72: Tff7b72nullTb4b4b4,
Te6edf3selectedProductTff7b72: Tff7b72nullTb4b4b4,
Te6edf3selectedModelTff7b72: Tff7b72nullTb4b4b4,
Te6edf3productsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"Heltec LoRa32 v2"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_H32_V2Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C4Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C9Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_heltec32v2.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"8MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v2.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v2.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v2.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v2.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"Heltec LoRa32 v3"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_H32_V3Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C5Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_CATb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_heltec32v3.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"8MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v3.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v3.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v3.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v3.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"Heltec LoRa32 v4"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_H32_V4Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C8Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz with PA"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_heltec32v4pa.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"16MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v4pa.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v4pa.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v4pa.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_heltec32v4pa.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"Heltec T114"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_HELTEC_T114Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_NRF52Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C6Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"470-510 MHz (HT-n5262-LF)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_C7Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"863-928 MHz (HT-n5262-HF)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_heltec_t114.zip"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO LoRa32 v1.0"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_T32_10Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_BATb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_BBTb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v10.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v10.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v10.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v10.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v10.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO LoRa32 v2.0"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_T32_20Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B3Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B8Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v20.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v20.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v20.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v20.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v20.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO LoRa32 v2.1"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_T32_21Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B4Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v21.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B9Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v21.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
T8b949e// The TCXO model codes are only used here to select the correct firmware,
T8b949e// actual model codes in firmware is still 0xB4 and 0xB9.
T8b949e// https://github.com/markqvist/Reticulum/blob/master/RNS/Utilities/rnodeconf.py#L156
T8b949e// https://github.com/markqvist/Reticulum/blob/master/RNS/Utilities/rnodeconf.py#L3283
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B4_TCXOTb4b4b4,
Te6edf3mapped_idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B4Tb4b4b4, T8b949e// this device uses the same model code, but different firmware file
Te6edf3nameTff7b72: Ta5d6ff"433 MHz, with TCXO"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B9_TCXOTb4b4b4,
Te6edf3mapped_idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_B9Tb4b4b4, T8b949e// this device uses the same model code, but different firmware file
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz, with TCXO"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_lora32v21_tcxo.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO LoRa T3S3"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_RNODETb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A5Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1278 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_AATb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1276 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx127x.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A1Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1268 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A6Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1262 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_ACTb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"2.4 GHz (with SX1280 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3_sx1280_pa.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx1280_pa.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx1280_pa.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx1280_pa.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3_sx1280_pa.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO T-Beam"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_TBEAMTb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_E4Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1278 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tbeam.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_E9Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1276 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tbeam.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_E3Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1268 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_E8Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1262 chip)"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_sx1262.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO T-Beam Supreme"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_TBEAM_S_V1Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_DBTb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1268 chip)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_DCTb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1262 chip)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tbeam_supreme.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_supreme.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_supreme.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_supreme.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tbeam_supreme.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO T-Deck"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_TDECKTb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_D4Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz (with SX1268 chip)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_D9Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868/915/923 MHz (with SX1262 chip)"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_tdeck.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_tdeck.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_tdeck.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_tdeck.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_tdeck.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"LilyGO T-Echo"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_TECHOTb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_NRF52Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_16Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_17Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_techo.zip"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"RAK4631"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_RAK4631Tb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_NRF52Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_11Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"433 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_12Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"868 MHz / 915 MHz / 923 MHz"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_rak4631.zip"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"RNode"Tb4b4b4,
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PRODUCT_RNODETb4b4b4,
Te6edf3platformTff7b72: Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tb4b4b4,
Te6edf3modelsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A2Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"Handheld v2.1 RNode, 410 - 525 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_ng21.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A7Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"Handheld v2.1 RNode, 820 - 1020 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_ng21.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.boot_app0"Tb4b4b4,
Ta5d6ff"0x1000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_ng21.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A1Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"Prototype v2.2 RNode, 410 - 525 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Te6edf3ROMTb4b4b4.Te6edf3MODEL_A6Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff"Prototype v2.2 RNode, 820 - 1020 MHz"Tb4b4b4,
Te6edf3firmware_filenameTff7b72: Ta5d6ff"rnode_firmware_t3s3.zip"Tb4b4b4,
Te6edf3flash_configTff7b72: Tb4b4b4{
Te6edf3flash_sizeTff7b72: Ta5d6ff"4MB"Tb4b4b4,
Te6edf3flash_filesTff7b72: Tb4b4b4{
Ta5d6ff"0xe000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.boot_app0"Tb4b4b4,
Ta5d6ff"0x0"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bootloader"Tb4b4b4,
Ta5d6ff"0x10000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.bin"Tb4b4b4,
Ta5d6ff"0x210000"Tff7b72: Ta5d6ff"console_image.bin"Tb4b4b4,
Ta5d6ff"0x8000"Tff7b72: Ta5d6ff"rnode_firmware_t3s3.partitions"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
T8b949e// Liam's default config for New Zealand / LongFast on Slot 10
Te6edf3configFrequencyTff7b72: T79c0ff917375000Tb4b4b4,
Te6edf3configBandwidthTff7b72: T79c0ff250000Tb4b4b4,
Te6edf3configTxPowerTff7b72: T79c0ff22Tb4b4b4,
Te6edf3configSpreadingFactorTff7b72: T79c0ff11Tb4b4b4,
Te6edf3configCodingRateTff7b72: T79c0ff5Tb4b4b4,
Te6edf3RNodeInterfaceDefaultsTff7b72: Tb4b4b4{
Te6edf3bandwidthsTff7b72: Tb4b4b4[
T8b949e// bandwidth in hz
T79c0ff7800Tb4b4b4, T8b949e// 7.8 kHz
T79c0ff10400Tb4b4b4, T8b949e// 10.4 kHz
T79c0ff15600Tb4b4b4, T8b949e// 15.6 kHz
T79c0ff20800Tb4b4b4, T8b949e// 20.8 kHz
T79c0ff31250Tb4b4b4, T8b949e// 31.25 kHz
T79c0ff41700Tb4b4b4, T8b949e// 41.7 kHz
T79c0ff62500Tb4b4b4, T8b949e// 62.5 kHz
T79c0ff125000Tb4b4b4, T8b949e// 125 kHz
T79c0ff250000Tb4b4b4, T8b949e// 250 kHz
T79c0ff500000Tb4b4b4, T8b949e// 500 kHz
Tb4b4b4]Tb4b4b4,
Te6edf3codingratesTff7b72: Tb4b4b4[
T79c0ff5Tb4b4b4, T8b949e// 4:5
T79c0ff6Tb4b4b4, T8b949e// 4:6
T79c0ff7Tb4b4b4, T8b949e// 4:7
T79c0ff8Tb4b4b4, T8b949e// 4:8
Tb4b4b4]Tb4b4b4,
Te6edf3spreadingfactorsTff7b72: Tb4b4b4[T79c0ff7Tb4b4b4, T79c0ff8Tb4b4b4, T79c0ff9Tb4b4b4, T79c0ff10Tb4b4b4, T79c0ff11Tb4b4b4, T79c0ff12Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3mountedTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3methodsTff7b72: Tb4b4b4{
Tff7b72async Te6edf3askForSerialPortTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3navigatorTb4b4b4.Te6edf3serialTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Web Serial is not supported in this browser. Please use Chrome, Edge, or another Chromium-based browser."Tb4b4b4;
Te6edf3alertTb4b4b4(
Ta5d6ff"Web Serial is not supported in this browser. Please use Chrome, Edge, or another Chromium-based browser."
Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
T8b949e// close any existing rnode connection
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Error closing existing connection:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3rnode Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4{
T8b949e// ask user to select device
Tff7b72return Tff7b72await Te6edf3navigatorTb4b4b4.Te6edf3serialTb4b4b4.Te6edf3requestPortTb4b4b4(Tb4b4b4{
Te6edf3filtersTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3eTb4b4b4.Te6edf3name Tff7b72=== Ta5d6ff"NotFoundError" Tff7b72|| Te6edf3eTb4b4b4.Te6edf3messageTff7b72?Tb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"No port selected"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"No device selected. Please select a serial port."Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Failed to connect to device: " Tff7b72+ Tb4b4b4(Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72throw Te6edf3eTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3askForRNodeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
T8b949e// ask for serial port
Tff7b72const Te6edf3serialPort Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForSerialPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Connecting to device..."Tb4b4b4;
T8b949e// check if device is an rnode
Tff7b72thisTb4b4b4.Te6edf3rnode Tff7b72= Tff7b72await Te6edf3RNodeTb4b4b4.Te6edf3fromSerialPortTb4b4b4(Te6edf3serialPortTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Detecting RNode..."Tb4b4b4;
Tff7b72const Te6edf3isRNode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3rnodeTb4b4b4.Te6edf3detectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isRNodeTb4b4b4) Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Selected device is not an RNode! Please make sure you've selected the correct serial port."Tb4b4b4;
Te6edf3alertTb4b4b4(
Ta5d6ff"Selected device is not an RNode! Please make sure you've selected the correct serial port."
Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3rnodeTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Failed to connect to RNode: " Tff7b72+ Tb4b4b4(Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72throw Te6edf3eTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3enterDfuModeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isEnteringDfuMode Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// ask for serial port
Tff7b72const Te6edf3serialPort Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForSerialPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// enter dfu mode
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"entering dfu mode"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3flasher Tff7b72= Tff7b72new Te6edf3Nrf52DfuFlasherTb4b4b4(Te6edf3serialPortTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3flasherTb4b4b4.Te6edf3enterDfuModeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"entering dfu mode: done"Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Device should now be in DFU mode. You can now proceed with flashing firmware."Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Failed to enter DFU mode: " Tff7b72+ Tb4b4b4(Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Failed to enter DFU mode: " Tff7b72+ Tb4b4b4(Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isEnteringDfuMode Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3flashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72switch Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3selectedProductTff7b72?Tb4b4b4.Te6edf3platformTb4b4b4) Tb4b4b4{
Tff7b72case Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_ESP32Tff7b72: Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3flashEsp32Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72case Te6edf3ROMTb4b4b4.Te6edf3PLATFORM_NRF52Tff7b72: Tb4b4b4{
Tff7b72await Tff7b72thisTb4b4b4.Te6edf3flashNrf52Tb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72defaultTff7b72: Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Please select a device first"Tb4b4b4)Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3flashNrf52Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Tff7b72nullTb4b4b4;
T8b949e// ensure firmware file selected
Tff7b72const Te6edf3file Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"file"Tb4b4b4]Tb4b4b4.Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fileTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Please select a firmware file (.zip) first."Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Please select a firmware file (.zip) first."Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3serialPort Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// ask for serial port
Te6edf3serialPort Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForSerialPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// update progress
Tff7b72thisTb4b4b4.Te6edf3isFlashing Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingProgress Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Initializing flash process..."Tb4b4b4;
T8b949e// flash file
Tff7b72const Te6edf3flasher Tff7b72= Tff7b72new Te6edf3Nrf52DfuFlasherTb4b4b4(Te6edf3serialPortTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3flasherTb4b4b4.Te6edf3flashTb4b4b4(Te6edf3fileTb4b4b4, Tb4b4b4(Te6edf3percentageTb4b4b4, Te6edf3messageTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashingProgress Tff7b72= Te6edf3percentageTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Te6edf3message Tff7b72|| Ta5d6ff`Ta5d6ffFlashing: Tffd700${Te6edf3percentageTffd700}Ta5d6ff%Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// flashing successful
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Flash complete!"Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Firmware has been flashed successfully!"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3errorMsg Tff7b72= Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Tffa657StringTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"No port selected"Tb4b4b4) Tff7b72|| Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"NotFoundError"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"No device selected. Please select a serial port and try again."Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"not an RNode"Tb4b4b4) Tff7b72|| Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"detect"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Failed to detect RNode. Make sure the device is connected and in the correct mode."Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"DFU"Tb4b4b4) Tff7b72|| Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"dfu"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"DFU mode error: " Tff7b72+
Te6edf3errorMsg Tff7b72+
Ta5d6ff". Make sure the device is in DFU mode (use 'Enter DFU Mode' button first)."Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Firmware flashing failed: " Tff7b72+ Te6edf3errorMsgTb4b4b4;
Tb4b4b4}
Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3flashErrorTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Flash error:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isFlashing Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
T8b949e// close port
Tff7b72if Tb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3serialPortTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Failed to close serial port:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3flashEsp32Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Tff7b72nullTb4b4b4;
T8b949e// ensure ESPLoader is available
Tff7b72if Tb4b4b4(Tff7b72!Tffa657windowTb4b4b4.Te6edf3ESPLoaderTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"esptool-js could not be loaded. Please refresh the page and try again."Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"esptool-js could not be loaded. Please refresh the page and try again."Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ensure flash config is known, use from selected model, or fallback to selected product
Tff7b72const Te6edf3flashConfig Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedModelTff7b72?Tb4b4b4.Te6edf3flash_config Tff7b72?? Tff7b72thisTb4b4b4.Te6edf3selectedProductTff7b72?Tb4b4b4.Te6edf3flash_configTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3flashConfigTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Flash configuration is not available for the selected device. Please select a different device or check the firmware file."Tb4b4b4;
Te6edf3alertTb4b4b4(
Ta5d6ff"Flash configuration is not available for the selected device. Please select a different device or check the firmware file."
Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ensure firmware file selected
Tff7b72const Te6edf3file Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$refsTb4b4b4[Ta5d6ff"file"Tb4b4b4]Tb4b4b4.Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fileTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Please select a firmware file (.zip) first."Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Please select a firmware file (.zip) first."Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3serialPort Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// ask for serial port
Te6edf3serialPort Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForSerialPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// update progress
Tff7b72thisTb4b4b4.Te6edf3isFlashing Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingProgress Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Connecting to ESP32 device..."Tb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// read zip file
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Reading firmware file..."Tb4b4b4;
Tff7b72const Te6edf3blobReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3BlobReaderTb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipReader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3ZipReaderTb4b4b4(Te6edf3blobReaderTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3zipEntries Tff7b72= Tff7b72await Te6edf3zipReaderTb4b4b4.Te6edf3getEntriesTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// get files to flash
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Extracting firmware files..."Tb4b4b4;
Tff7b72const Te6edf3filesToFlash Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Tb4b4b4[Te6edf3addressTb4b4b4, Te6edf3filenameTb4b4b4] Tff7b72of Tffa657ObjectTb4b4b4.Te6edf3entriesTb4b4b4(Te6edf3flashConfigTb4b4b4.Te6edf3flash_filesTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// find file inside zip
Tff7b72const Te6edf3file Tff7b72= Te6edf3zipEntriesTb4b4b4.Te6edf3findTb4b4b4(Tb4b4b4(Te6edf3zipEntryTb4b4b4) Tb4b4b4=> Te6edf3zipEntryTb4b4b4.Te6edf3filename Tff7b72=== Te6edf3filenameTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fileTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(
Ta5d6ff`Ta5d6ffRequired file "Tffd700${Te6edf3filenameTffd700}Ta5d6ff" not found in firmware ZIP file. Please download the correct firmware for your device.Ta5d6ff`
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// get file data as binary string
Tff7b72const Te6edf3blob Tff7b72= Tff7b72await Te6edf3fileTb4b4b4.Te6edf3getDataTb4b4b4(Tff7b72new Tffa657windowTb4b4b4.Te6edf3zipTb4b4b4.Te6edf3BlobWriterTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3data Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3readAsBinaryStringTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4; T8b949e// fixme: deprecated, but works for now
T8b949e// add to files to flash
Te6edf3filesToFlashTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3addressTff7b72: Tffa657parseIntTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4,
Te6edf3dataTff7b72: Te6edf3dataTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// init transport and esploader
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Connecting to ESP32..."Tb4b4b4;
Tff7b72const Te6edf3transport Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3TransportTb4b4b4(Te6edf3serialPortTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3esploader Tff7b72= Tff7b72new Tffa657windowTb4b4b4.Te6edf3ESPLoaderTb4b4b4(Tb4b4b4{
Te6edf3transportTff7b72: Te6edf3transportTb4b4b4,
Te6edf3baudrateTff7b72: T79c0ff921600Tb4b4b4,
Te6edf3debugLoggingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3enableTracingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3terminalTff7b72: Tb4b4b4{
Te6edf3cleanTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3writeLineTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3writeTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// load device info
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Detecting ESP32 device..."Tb4b4b4;
Tff7b72await Te6edf3esploaderTb4b4b4.Te6edf3mainTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// flash device
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Flashing firmware..."Tb4b4b4;
Tff7b72await Te6edf3esploaderTb4b4b4.Te6edf3writeFlashTb4b4b4(Tb4b4b4{
Te6edf3fileArrayTff7b72: Te6edf3filesToFlashTb4b4b4,
Te6edf3flashSizeTff7b72: Te6edf3flashConfigTb4b4b4.Te6edf3flash_sizeTb4b4b4,
Te6edf3flashModeTff7b72: Ta5d6ff"DIO"Tb4b4b4,
Te6edf3flashFreqTff7b72: Ta5d6ff"80MHz"Tb4b4b4,
Te6edf3eraseAllTff7b72: Tff7b72falseTb4b4b4,
Te6edf3compressTff7b72: Tff7b72trueTb4b4b4,
Te6edf3calculateMD5HashTff7b72: Tb4b4b4(Te6edf3imageTb4b4b4) Tb4b4b4=> Te6edf3CryptoJSTb4b4b4.Te6edf3MD5Tb4b4b4(Te6edf3CryptoJSTb4b4b4.Te6edf3encTb4b4b4.Te6edf3Latin1Tb4b4b4.Te6edf3parseTb4b4b4(Te6edf3imageTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3reportProgressTff7b72: Tb4b4b4(Te6edf3fileIndexTb4b4b4, Te6edf3writtenTb4b4b4, Te6edf3totalTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3currentFilePercentage Tff7b72= Tb4b4b4(Te6edf3written Tff7b72/ Te6edf3totalTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingProgress Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3currentFilePercentageTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff`Ta5d6ffFlashing file Tffd700${Te6edf3fileIndex Tff7b72+ T79c0ff1Tffd700}Ta5d6ff/Tffd700${Te6edf3filesToFlashTb4b4b4.Te6edf3lengthTffd700}Ta5d6ff: Tffd700${Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3currentFilePercentageTb4b4b4)Tffd700}Ta5d6ff%Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
T8b949e// reboot device
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Rebooting device..."Tb4b4b4;
Tff7b72await Te6edf3transportTb4b4b4.Te6edf3setDTRTb4b4b4(Tff7b72falseTb4b4b4)Tb4b4b4;
Tff7b72await Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4) Tb4b4b4=> Te6edf3setTimeoutTb4b4b4(Te6edf3resolveTb4b4b4, T79c0ff100Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3transportTb4b4b4.Te6edf3setDTRTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
T8b949e// flashing successful
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff"Flash complete!"Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Firmware has been flashed successfully!"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3errorMsg Tff7b72= Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Tffa657StringTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"not found in firmware"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Te6edf3errorMsgTb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"Failed to connect"Tb4b4b4) Tff7b72|| Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"timeout"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Failed to connect to ESP32 device. Make sure:\n• The device is connected via USB\n• The correct serial port is selected\n• The device is not in use by another program\n• Try pressing the BOOT button on the device"Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"flash"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72=
Ta5d6ff"Flash error: " Tff7b72+
Te6edf3errorMsg Tff7b72+
Ta5d6ff"\n\nMake sure you're using the correct firmware file for your device model."Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Firmware flashing failed: " Tff7b72+ Te6edf3errorMsgTb4b4b4;
Tb4b4b4}
Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3flashErrorTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Flash error:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isFlashing Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
T8b949e// close port
Tff7b72if Tb4b4b4(Te6edf3serialPortTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3serialPortTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"Failed to close serial port:"Tb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3errorMsg Tff7b72= Te6edf3eTb4b4b4.Te6edf3message Tff7b72|| Tffa657StringTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"No port selected"Tb4b4b4) Tff7b72|| Te6edf3errorMsgTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"NotFoundError"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"No device selected. Please select a serial port and try again."Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3flashError Tff7b72= Ta5d6ff"Failed to start flash process: " Tff7b72+ Te6edf3errorMsgTb4b4b4;
Tb4b4b4}
Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3flashErrorTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isFlashing Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3flashingStatus Tff7b72= Ta5d6ff""Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3detectTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3firmwareVersion Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareVersionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Device has RNode firmware v" Tff7b72+ Te6edf3firmwareVersionTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Tb4b4b4{
Te6edf3firmware_versionTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareVersionTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3platformTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getPlatformTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3mcuTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getMcuTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3boardTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getBoardTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3device_hashTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getDeviceHashTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3firmware_hash_targetTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getTargetFirmwareHashTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3firmware_hashTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareHashTb4b4b4(Tb4b4b4)Tb4b4b4,
T8b949e// rom: await rnode.getRom(),
Te6edf3frequencyTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getFrequencyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3bandwidthTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getBandwidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3tx_powerTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getTxPowerTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3spreading_factorTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getSpreadingFactorTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3coding_rateTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getCodingRateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3radio_stateTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRadioStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_statTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRxStatTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3tx_statTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getTxStatTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rssi_statTff7b72: Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRssiStatTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3packIntTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3buffer Tff7b72= Tff7b72new Tffa657ArrayBufferTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4; T8b949e// 4 bytes for a 32-bit integer
Tff7b72const Te6edf3view Tff7b72= Tff7b72new Tffa657DataViewTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Te6edf3viewTb4b4b4.Te6edf3setUint32Tb4b4b4(T79c0ff0Tb4b4b4, Te6edf3valueTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4; T8b949e// false for big-endian
Tff7b72return Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3unpackIntTb4b4b4(Te6edf3byteArrayTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3buffer Tff7b72= Tff7b72new Tffa657Uint8ArrayTb4b4b4(Te6edf3byteArrayTb4b4b4)Tb4b4b4.Te6edf3bufferTb4b4b4; T8b949e// Get the underlying ArrayBuffer from the byte array
Tff7b72const Te6edf3view Tff7b72= Tff7b72new Tffa657DataViewTb4b4b4(Te6edf3bufferTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3viewTb4b4b4.Te6edf3getUint32Tb4b4b4(T79c0ff0Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4; T8b949e// false for big-endian
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3rebootTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// reboot
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// done
Te6edf3alertTb4b4b4(Ta5d6ff"Board is rebooting!"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3frameBufferToCanvasTb4b4b4(Te6edf3framebufferTb4b4b4, Te6edf3widthTb4b4b4, Te6edf3heightTb4b4b4, Te6edf3backgroundColourTb4b4b4, Te6edf3foregroundColourTb4b4b4) Tb4b4b4{
T8b949e// create canvas
Tff7b72const Te6edf3canvas Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"canvas"Tb4b4b4)Tb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72= Te6edf3widthTb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72= Te6edf3heightTb4b4b4;
T8b949e// fill the canvas with background colour
Tff7b72const Te6edf3ctx Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"2d"Tb4b4b4)Tb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3fillStyle Tff7b72= Te6edf3backgroundColourTb4b4b4;
Te6edf3ctxTb4b4b4.Te6edf3fillRectTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3widthTb4b4b4, Te6edf3heightTb4b4b4)Tb4b4b4;
T8b949e// draw foreground pixels where bits are 1
Te6edf3ctxTb4b4b4.Te6edf3fillStyle Tff7b72= Te6edf3foregroundColourTb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3y Tff7b72= T79c0ff0Tb4b4b4; Te6edf3y Tff7b72< Te6edf3heightTb4b4b4; Te6edf3yTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3x Tff7b72= T79c0ff0Tb4b4b4; Te6edf3x Tff7b72< Te6edf3widthTb4b4b4; Te6edf3xTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3byteIndex Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3y Tff7b72* Te6edf3width Tff7b72+ Te6edf3xTb4b4b4) Tff7b72/ T79c0ff8Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3bitIndex Tff7b72= Te6edf3x Tff7b72% T79c0ff8Tb4b4b4;
Tff7b72const Te6edf3bit Tff7b72= Tb4b4b4(Te6edf3framebufferTb4b4b4[Te6edf3byteIndexTb4b4b4] Tff7b72>> Tb4b4b4(T79c0ff7 Tff7b72- Te6edf3bitIndexTb4b4b4)Tb4b4b4) Tff7b72& T79c0ff1Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bitTb4b4b4) Tb4b4b4{
Te6edf3ctxTb4b4b4.Te6edf3fillRectTb4b4b4(Te6edf3xTb4b4b4, Te6edf3yTb4b4b4, T79c0ff1Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3canvasTb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3rnodeDisplayBufferToPngTb4b4b4(Te6edf3displayBufferTb4b4b4) Tb4b4b4{
T8b949e// get display area and stat area
Tff7b72const Te6edf3displayArea Tff7b72= Te6edf3displayBufferTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff512Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3statArea Tff7b72= Te6edf3displayBufferTb4b4b4.Te6edf3sliceTb4b4b4(T79c0ff512Tb4b4b4, T79c0ff1024Tb4b4b4)Tb4b4b4;
T8b949e// create canvas from frame buffers
Tff7b72const Te6edf3displayCanvasOriginal Tff7b72= Tff7b72thisTb4b4b4.Te6edf3frameBufferToCanvasTb4b4b4(
Te6edf3displayAreaTb4b4b4,
T79c0ff64Tb4b4b4,
T79c0ff64Tb4b4b4,
Ta5d6ff"#000000"Tb4b4b4,
Ta5d6ff"#FFFFFF"
Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3statCanvasOriginal Tff7b72= Tff7b72thisTb4b4b4.Te6edf3frameBufferToCanvasTb4b4b4(Te6edf3statAreaTb4b4b4, T79c0ff64Tb4b4b4, T79c0ff64Tb4b4b4, Ta5d6ff"#000000"Tb4b4b4, Ta5d6ff"#FFFFFF"Tb4b4b4)Tb4b4b4;
T8b949e// create horizontal canvas to show display area and stat area next to each other
Tff7b72const Te6edf3canvas Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"canvas"Tb4b4b4)Tb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72= T79c0ff128Tb4b4b4;
Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72= T79c0ff64Tb4b4b4;
T8b949e// draw canvases to final canvas
Tff7b72const Te6edf3canvasCtx Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"2d"Tb4b4b4)Tb4b4b4;
Te6edf3canvasCtxTb4b4b4.Te6edf3imageSmoothingEnabled Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3canvasCtxTb4b4b4.Te6edf3drawImageTb4b4b4(Te6edf3displayCanvasOriginalTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff64Tb4b4b4, T79c0ff64Tb4b4b4)Tb4b4b4;
Te6edf3canvasCtxTb4b4b4.Te6edf3drawImageTb4b4b4(Te6edf3statCanvasOriginalTb4b4b4, T79c0ff64Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff64Tb4b4b4, T79c0ff64Tb4b4b4)Tb4b4b4;
T8b949e// create scaled canvas
Tff7b72const Te6edf3scaleFactor Tff7b72= T79c0ff4Tb4b4b4;
Tff7b72const Te6edf3scaledCanvas Tff7b72= Tffa657documentTb4b4b4.Te6edf3createElementTb4b4b4(Ta5d6ff"canvas"Tb4b4b4)Tb4b4b4;
Te6edf3scaledCanvasTb4b4b4.Te6edf3width Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3width Tff7b72* Te6edf3scaleFactorTb4b4b4;
Te6edf3scaledCanvasTb4b4b4.Te6edf3height Tff7b72= Te6edf3canvasTb4b4b4.Te6edf3height Tff7b72* Te6edf3scaleFactorTb4b4b4;
T8b949e// scale original canvas onto new canvas
Tff7b72const Te6edf3scaledCtx Tff7b72= Te6edf3scaledCanvasTb4b4b4.Te6edf3getContextTb4b4b4(Ta5d6ff"2d"Tb4b4b4)Tb4b4b4;
Te6edf3scaledCtxTb4b4b4.Te6edf3imageSmoothingEnabled Tff7b72= Tff7b72falseTb4b4b4;
Te6edf3scaledCtxTb4b4b4.Te6edf3drawImageTb4b4b4(Te6edf3canvasTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Te6edf3scaledCanvasTb4b4b4.Te6edf3widthTb4b4b4, Te6edf3scaledCanvasTb4b4b4.Te6edf3heightTb4b4b4)Tb4b4b4;
T8b949e// convert canvas to png
Tff7b72return Te6edf3scaledCanvasTb4b4b4.Te6edf3toDataURLTb4b4b4(Ta5d6ff"image/png"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3readDisplayTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// read display
Tff7b72const Te6edf3displayBuffer Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3readDisplayTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// disconnect from rnode
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// update ui
Tff7b72thisTb4b4b4.Te6edf3rnodeDisplayImage Tff7b72= Tff7b72thisTb4b4b4.Te6edf3rnodeDisplayBufferToPngTb4b4b4(Te6edf3displayBufferTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3dumpEepromTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// get rom
Tff7b72const Te6edf3eeprom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3eepromTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Unable to retrieve eeprom!"Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// done
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Te6edf3eepromTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3wipeEepromTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ask user to confirm
Tff7b72if Tb4b4b4(
Tff7b72!Te6edf3confirmTb4b4b4(
Ta5d6ff"Are you sure you want to wipe the eeprom on this device? This will take about 30 seconds. An alert will show when the eeprom wipe has finished."
Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// wipe eeprom
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"wiping eeprom"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3wipeRomTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"wiping eeprom: done"Tb4b4b4)Tb4b4b4;
T8b949e// must reboot device after wipe
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// done
Te6edf3alertTb4b4b4(Ta5d6ff"eeprom has been wiped!"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3provisionTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3detailsTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3detailsTb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is already provisioned. You must wipe it to reprovision!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ensure user has selected product
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedProductTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Please select a product!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// ensure user has selected model
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3selectedModelTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Please select a model!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"device is not provisioned yet, doing it now..."Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isProvisioning Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// determine device info
T8b949e// todo implement ui to configure these values
Tff7b72const Te6edf3product Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedProductTb4b4b4.Te6edf3idTb4b4b4;
T8b949e// use mapped_id if available, else fallback to id, some devices use the same model, but different firmware file
Tff7b72const Te6edf3model Tff7b72= Tff7b72thisTb4b4b4.Te6edf3selectedModelTb4b4b4.Te6edf3mapped_id Tff7b72?? Tff7b72thisTb4b4b4.Te6edf3selectedModelTb4b4b4.Te6edf3idTb4b4b4;
Tff7b72const Te6edf3hardwareRevision Tff7b72= T79c0ff0x1Tb4b4b4;
Tff7b72const Te6edf3serialNumber Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72const Te6edf3timestampInSeconds Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3serialBytes Tff7b72= Tff7b72thisTb4b4b4.Te6edf3packIntTb4b4b4(Te6edf3serialNumberTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3timestampBytes Tff7b72= Tff7b72thisTb4b4b4.Te6edf3packIntTb4b4b4(Te6edf3timestampInSecondsTb4b4b4)Tb4b4b4;
T8b949e// compute device info checksum
Tff7b72const Te6edf3checksum Tff7b72= Te6edf3UtilsTb4b4b4.Te6edf3md5Tb4b4b4(Tb4b4b4[
Te6edf3productTb4b4b4,
Te6edf3modelTb4b4b4,
Te6edf3hardwareRevisionTb4b4b4,
Tb4b4b4...Te6edf3serialBytesTb4b4b4,
Tb4b4b4...Te6edf3timestampBytesTb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"checksum"Tb4b4b4, Te6edf3checksumTb4b4b4)Tb4b4b4;
T8b949e// write device info to eeprom
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing device info"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_PRODUCTTb4b4b4, Te6edf3productTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_MODELTb4b4b4, Te6edf3modelTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_HW_REVTb4b4b4, Te6edf3hardwareRevisionTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIALTb4b4b4, Te6edf3serialBytesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3serialBytesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff2Tb4b4b4, Te6edf3serialBytesTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_SERIAL Tff7b72+ T79c0ff3Tb4b4b4, Te6edf3serialBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADETb4b4b4, Te6edf3timestampBytesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3timestampBytesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff2Tb4b4b4, Te6edf3timestampBytesTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_MADE Tff7b72+ T79c0ff3Tb4b4b4, Te6edf3timestampBytesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing device info: done"Tb4b4b4)Tb4b4b4;
T8b949e// write checksum to eeprom
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing checksum"Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff16Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_CHKSUM Tff7b72+ Te6edf3iTb4b4b4, Te6edf3checksumTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing checksum: done"Tb4b4b4)Tb4b4b4;
T8b949e// write signature to eeprom
T8b949e// fixme: actually implement signature, for now it's just zeroed out
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing signature"Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72var Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< T79c0ff128Tb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
T8b949e// await rnode.writeRom(ROM.ADDR_SIGNATURE + i, signature[i]);
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_SIGNATURE Tff7b72+ Te6edf3iTb4b4b4, T79c0ff0x00Tb4b4b4)Tb4b4b4; T8b949e// fixme: fake signature
Tb4b4b4}
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing signature: done"Tb4b4b4)Tb4b4b4;
T8b949e// write info lock byte to eeprom
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing lock byte"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3writeRomTb4b4b4(Te6edf3ROMTb4b4b4.Te6edf3ADDR_INFO_LOCKTb4b4b4, Te6edf3ROMTb4b4b4.Te6edf3INFO_LOCK_BYTETb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3UtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"writing lock byte: done"Tb4b4b4)Tb4b4b4;
T8b949e// todo get partition hash from release.json OR directly from the firmware.bin
T8b949e// partition_filename = fw_filename.replace(".zip", ".bin")
T8b949e// partition_hash = get_partition_hash(rnode.platform, UPD_DIR+"/"+selected_version+"/"+partition_filename)
T8b949e// todo set firmware hash in eeprom
T8b949e// RNS.log("Setting firmware checksum...")
T8b949e// rnode.set_firmware_hash(partition_hash)
T8b949e// RNS.log("Generating a new device signing key...")
T8b949e// device_signer = RNS.Identity()
T8b949e// device_signer.to_file(FWD_DIR+"/device.key")
T8b949e// RNS.log("Device signing key written to "+str(FWD_DIR+"/device.key"))
T8b949e// if not os.path.isfile(FWD_DIR+"/signing.key"):
T8b949e// RNS.log("Generating a new EEPROM signing key...")
T8b949e// private_key = rsa.generate_private_key(
T8b949e// public_exponent=65537,
T8b949e// key_size=1024,
T8b949e// backend=default_backend()
T8b949e// )
T8b949e// private_bytes = private_key.private_bytes(
T8b949e// encoding=serialization.Encoding.DER,
T8b949e// format=serialization.PrivateFormat.PKCS8,
T8b949e// encryption_algorithm=serialization.NoEncryption()
T8b949e// )
T8b949e// public_key = private_key.public_key()
T8b949e// public_bytes = public_key.public_bytes(
T8b949e// encoding=serialization.Encoding.DER,
T8b949e// format=serialization.PublicFormat.SubjectPublicKeyInfo
T8b949e// )
T8b949e// can get partition hash from releases.json
T8b949e// partition_hash = bytes.fromhex(release_info.split()[1])
T8b949e// await rnode.indicateFirmwareUpdate();
T8b949e// await rnode.setFirmwareHash(partition_hash);
T8b949e// todo get signing.key
T8b949e// file = open(key_path, "rb")
T8b949e// private_bytes = file.read()
T8b949e// file.close()
T8b949e// private_key = serialization.load_der_private_key(
T8b949e// private_bytes,
T8b949e// password=None,
T8b949e// backend=default_backend()
T8b949e// )
T8b949e// public_key = private_key.public_key()
T8b949e// public_bytes = public_key.public_bytes(
T8b949e// encoding=serialization.Encoding.DER,
T8b949e// format=serialization.PublicFormat.SubjectPublicKeyInfo
T8b949e// )
T8b949e// signature = private_key.sign(
T8b949e// checksum,
T8b949e// padding.PSS(
T8b949e// mgf=padding.MGF1(hashes.SHA256()),
T8b949e// salt_length=padding.PSS.MAX_LENGTH
T8b949e// ),
T8b949e// hashes.SHA256()
T8b949e// )
T8b949e// wait a bit for eeprom writes to complete
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"device has been provisioned!"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"failed to provision, please try again"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isProvisioning Tff7b72= Tff7b72falseTb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3setFirmwareHashTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isSettingFirmwareHash Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
T8b949e// todo: this works, but we should be calculating the firmware hash from the file, and not giving the board what it already knows
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"setting firmware hash"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setFirmwareHashTb4b4b4(Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareHashTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"setting firmware hash: done"Tb4b4b4)Tb4b4b4;
T8b949e// wait a bit for eeprom writes to complete
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4;
T8b949e// reset board if it didn't do it automatically
Tff7b72try Tb4b4b4{
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"couldn't auto reset board, probably did it automatically..."Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3alertTb4b4b4(Ta5d6ff"firmware hash has been set!"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"failed to set firmware hash, please try again"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72thisTb4b4b4.Te6edf3isSettingFirmwareHash Tff7b72= Tff7b72falseTb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3enableTncModeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// todo check if firmware hashes match, as config will not save if device has invalid target hash, because radio must be able to init
T8b949e// configure
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"configuring"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setFrequencyTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configFrequencyTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setBandwidthTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configBandwidthTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setTxPowerTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configTxPowerTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setSpreadingFactorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configSpreadingFactorTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setCodingRateTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3configCodingRateTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setRadioStateOnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"configuring: done"Tb4b4b4)Tb4b4b4;
T8b949e// save config
T8b949e// fixme: for some reason, sending saveConfig ONCE doesn't write the entire config to eeprom...???
T8b949e// fixme: when calling saveConfig once, it seems to miss the last 2 bytes of frequency, and doesn't set the conf ok byte...
T8b949e// fixme: however, it seems to save it correctly if I send the CMD_CONF_SAVE more than once...
T8b949e// fixme: note that sending the CMD_CONF_SAVE once in the python implementation seems to work fine, just not here...
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"saving config"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff500Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3saveConfigTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3saveConfigTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"saving config: done"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"TNC mode has been enabled!"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3disableTncModeTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// todo check if firmware hashes match, as config will not save if device has invalid target hash, because radio must be able to init
T8b949e// configure
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"disabling tnc mode"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3deleteConfigTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"disabling tnc mode: done"Tb4b4b4)Tb4b4b4;
T8b949e// wait a bit for eeprom writes to complete
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"TNC mode has been disabled!"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3enableBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// enable bluetooth
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"enabling bluetooth"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3enableBluetoothTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"enabling bluetooth: done"Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Bluetooth has been enabled!"Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3disableBluetoothTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// disable bluetooth
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"disabling bluetooth"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3disableBluetoothTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"disabling bluetooth: done"Tb4b4b4)Tb4b4b4;
Te6edf3alertTb4b4b4(Ta5d6ff"Bluetooth has been disabled!"Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3UtilsTb4b4b4.Te6edf3sleepMillisTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3startBluetoothPairingTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// start bluetooth pairing
Tff7b72try Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"start bluetooth pairing"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3startBluetoothPairingTb4b4b4(Tff7b72async Tb4b4b4(Te6edf3pinTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Bluetooth Pairing Pin: " Tff7b72+ Te6edf3pinTb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"start bluetooth pairing: done"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errorTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Te6edf3errorTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e// tell user device is in pairing mode, and how to pair
Te6edf3alertTb4b4b4(
Tb4b4b4[
Ta5d6ff"- RNode is in Bluetooth Pairing Mode for 30 seconds."Tb4b4b4,
Ta5d6ff"- Close this alert before performing the next steps."Tb4b4b4,
Ta5d6ff"- Open bluetooth settings on your Android device."Tb4b4b4,
Ta5d6ff"- Click pair on the RNode device that shows up."Tb4b4b4,
Ta5d6ff"- Bluetooth pin will shown on your RNode screen and on this page."Tb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3setDisplayRotationTb4b4b4(Te6edf3rotationTb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// configure
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"setting display rotation"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3setDisplayRotationTb4b4b4(Te6edf3rotationTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"setting display rotation: done"Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3startDisplayReconditioningTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// ask for rnode
Tff7b72const Te6edf3rnode Tff7b72= Tff7b72await Tff7b72thisTb4b4b4.Te6edf3askForRNodeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnodeTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// check if device has been provisioned
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3details Tff7b72= Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3details Tff7b72|| Tff7b72!Te6edf3detailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Te6edf3alertTb4b4b4(Ta5d6ff"Eeprom is not provisioned. You must do this first!"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
T8b949e// configure
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"starting display reconditioning"Tb4b4b4)Tb4b4b4;
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3startDisplayReconditioningTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Ta5d6ff"starting display reconditioning: done"Tb4b4b4)Tb4b4b4;
T8b949e// done
Tff7b72await Te6edf3rnodeTb4b4b4.Te6edf3closeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3readAsBinaryStringTb4b4b4(Te6edf3blobTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3resolveTb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3reader Tff7b72= Tff7b72new Te6edf3FileReaderTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3readerTb4b4b4.Te6edf3onload Tff7b72= Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3resolveTb4b4b4(Te6edf3readerTb4b4b4.Te6edf3resultTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3readerTb4b4b4.Te6edf3readAsBinaryStringTb4b4b4(Te6edf3blobTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3computedTff7b72: Tb4b4b4{
Te6edf3recommendedFirmwareFilenameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3selectedModelTff7b72?Tb4b4b4.Te6edf3firmware_filename Tff7b72?? Tff7b72thisTb4b4b4.Te6edf3selectedProductTff7b72?Tb4b4b4.Te6edf3firmware_filenameTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3watchTff7b72: Tb4b4b4{
Te6edf3selectedProductTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// reset selected model when changing selected product
Tff7b72thisTb4b4b4.Te6edf3selectedModel Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4.Te6edf3mountTb4b4b4(Ta5d6ff"#app"Tb4b4b4)Tb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72bodyTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72htmlTb4b4b4>
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────